#include<bits/stdc++.h> 
using namespace std;
//	浙大有40000学生以及2500课，给定一系列每个学生已经注册的课程列表，你需要输出所有课程的
//	学生姓名列表
//1.每个输入都有一个测试用例，对于每个测试用例，第一行包括两个数字N≤40000，K≤2500，分别
//	表示学生总数和课程总数。
//2.后面N行，每行包括一个学生姓名(3个大写字母和1个数字)，一个正整数C≤20(表示注册的课程总 
//	数) ，然后跟着C个课程编号，编号大小为1~K
//3.对于每一个测试用例，输出每门课的学生姓名列表。按照课程序号升序输出。对于每个课，首先
//	输出这门课选课人数，然后输出姓名，姓名按照字母序排列。每个名字一行 
//4.性能题 
unordered_map<int, string> stu_map;	//姓名与编号对应关系 
bool cmp(int a, int b){	//排序方式 
	return stu_map[a]<stu_map[b];
}
int main(){	//这道题不难，就是桶一下排序一下再输出的事情。但是一般用cin和cout的话会造成测试点3超时，所以得用scanf和printf代替 
	int N,M;
	cin>>N>>M;
	vector<int> course[M+1]; 
	for(int i = 0;i<N;i++){
		string s;
		cin>>s;
		stu_map[i] = s;
		int nn;
		scanf("%d",&nn);
		for(int j = 0;j<nn;j++){
			int c;
			scanf("%d",&c);
			course[c].push_back(i);
		}
	}
	for(int i =1;i<=M;i++){
		int len = course[i].size();		
		printf("%d %d\n",i,len);
		sort(course[i].begin(),course[i].end(),cmp);
		for(int j =0;j<len;j++){
			printf("%s\n", stu_map[course[i][j]].c_str());
		}
	}
	return 0;
} 